﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace FrbaCommerce.Generar_Publicacion
{
    public partial class GenerarPublicacion : Form
    {
        
        private string tipo;
        private int usuario;
        
        public struct Rubro
        {
            public int id;
            public string desc {get;set;}
        };

        public struct Estado
        {
            public int id;
            public string desc { get; set; }
        };

        public struct Visibilidad
        {
            public int id;
            public string desc { get; set; }
            public double precio;
            public double porcentaje;
            public int duracion;
        };



        public GenerarPublicacion(int usuario)
        {
            InitializeComponent();
            this.usuario = usuario;
        }

        private void mTBFechaInicio_Click(object sender, System.EventArgs e)
        {
            monthCalendar.Visible = true;
        }

        private void monthCalendar_DateSelected(object sender, DateRangeEventArgs e)
        {
            mTBFechaInicio.Text = monthCalendar.SelectionStart.ToString("dd/MM//yyyy");
            monthCalendar.Visible = false;
            actualizarVencimiento();
        }

        public void CargarRubros(ListBox lista) 
        {
            SqlConnection con = Program.obtenerConexion();

            SqlCommand leerRubros = new SqlCommand("SELECT rub_id, rub_descripcion from Monkey_Coders.Rubros", con);
            SqlDataReader lector = leerRubros.ExecuteReader();

            if (lector.HasRows)
            {
                while (lector.Read())
                {
                    
                    Rubro rubro = new Rubro();
                    rubro.id = Convert.ToInt32(lector["rub_id"]);
                    rubro.desc = lector["rub_descripcion"].ToString();
                    lista.Items.Add(rubro);
                }
            }
       
        }

        public void CargarVisibilidades(ComboBox combo)
        {

            SqlConnection con = Program.obtenerConexion();

            SqlCommand leerVisibilidades = new SqlCommand("SELECT vis_cod, vis_descripcion, vis_precio, vis_porcentaje_comision, vis_duracion from Monkey_Coders.Visibilidades", con);
            SqlDataReader lector = leerVisibilidades.ExecuteReader();

            if (lector.HasRows)
            {
                while (lector.Read())
                {
                    Visibilidad visib = new Visibilidad();
                    visib.id = Convert.ToInt32(lector["vis_cod"]);
                    visib.desc = lector["vis_descripcion"].ToString();
                    visib.precio = Convert.ToDouble(lector["vis_precio"]);
                    visib.porcentaje = Convert.ToDouble(lector["vis_porcentaje_comision"]);
                    visib.duracion = Convert.ToInt32(lector["vis_duracion"]);
                    combo.Items.Add(visib);
                }
            }

            combo.SelectedIndex = 0;

        }

        public void CargarEstados(ComboBox combo)
        {

            SqlConnection con = Program.obtenerConexion();

            SqlCommand leerEstados = new SqlCommand("SELECT est_id, est_descripcion from Monkey_Coders.Estados_Publicaciones", con);
            SqlDataReader lector = leerEstados.ExecuteReader();

            if (lector.HasRows)
            {
                while (lector.Read())
                {
                    Estado est = new Estado();
                    est.id = Convert.ToInt32(lector["est_id"]);
                    est.desc = lector["est_descripcion"].ToString();
                    combo.Items.Add(est);
                }
            }

            combo.SelectedIndex = 0;

        }



        private void GenerarPublicacion_Load(object sender, EventArgs e)
        {
            monthCalendar.TodayDate = Program.FechaActual;
            monthCalendar.SelectionStart = Program.FechaActual;
            mTBFechaInicio.Text = Program.FechaActual.ToString();
            CargarRubros(listBoxRubros);
            CargarVisibilidades(comboBoxVisib);
            CargarEstados(comboBoxEstado);
            comboBoxEstado.Items.RemoveAt(3);
        }

        private void labelAdd_Click(object sender, EventArgs e)
        {
            if (listBoxRubros.SelectedItem != null && !listBoxRubrosFinal.Items.Contains(listBoxRubros.SelectedItem))
            {
                listBoxRubrosFinal.Items.Add(listBoxRubros.SelectedItem);
                listBoxRubros.Items.Remove(listBoxRubros.SelectedItem);
            }
        }
       
        private void labelRmv_Click(object sender, EventArgs e)
        {
            if (listBoxRubrosFinal.SelectedItem != null && (!listBoxRubros.Items.Contains(listBoxRubrosFinal.SelectedItem)))
            {
                listBoxRubros.Items.Add(listBoxRubrosFinal.SelectedItem);
                listBoxRubrosFinal.Items.Remove(listBoxRubrosFinal.SelectedItem);
            }
        }

        private void publicar() {
            SqlConnection con = Program.obtenerConexion();

            SqlCommand publicar = new SqlCommand("INSERT INTO Monkey_Coders.Publicaciones "
                +"(pub_descripcion, pub_stock, pub_fecha_inicio, pub_fecha_venc, pub_precio, pub_tipo, pub_preguntas, pub_visibilidad_cod, pub_usuario_id, pub_estado_id)"
               // + " OUTPUT INSERTED.pub_cod"
                + " VALUES (@desc,@stock,@fechainicio,@fechavenc,@precio,@tipo,@preg,@visib,@usuario,@estado) ; SELECT SCOPE_IDENTITY()", con);
            publicar.Parameters.Add("desc", SqlDbType.VarChar, 255).Value = textBoxDesc.Text;
            publicar.Parameters.Add("stock", SqlDbType.Int, 18).Value = mTBStock.Text;
            publicar.Parameters.Add("fechainicio", SqlDbType.DateTime,50).Value = mTBFechaInicio.Text;
            publicar.Parameters.Add("fechavenc", SqlDbType.DateTime,50).Value = mTBFechaVencimiento.Text;
            publicar.Parameters.Add("precio", SqlDbType.Money, 18).Value = mTBPrecio.Text;
            publicar.Parameters.Add("tipo", SqlDbType.VarChar, 255).Value = tipo;
            publicar.Parameters.Add("preg", SqlDbType.Bit).Value = checkBoxPP.CheckState;
            publicar.Parameters.Add("visib", SqlDbType.Int, 18).Value = ((Visibilidad)comboBoxVisib.SelectedItem).id;
            publicar.Parameters.Add("usuario", SqlDbType.Int, 18).Value = usuario;
            publicar.Parameters.Add("estado", SqlDbType.Int, 18).Value = ((Estado)comboBoxEstado.SelectedItem).id;

            Int32 newID = Convert.ToInt32(publicar.ExecuteScalar());
        
            
            foreach (Rubro rubro in listBoxRubrosFinal.Items)
            {
            SqlCommand asignarRubros = new SqlCommand("INSERT INTO [Monkey_Coders].Rubros_publicaciones (rp_pub_id, rp_rub_id) VALUES (@publicacion, @rubroID)", con);
            asignarRubros.Parameters.Add("publicacion", SqlDbType.Int, 18).Value = newID;
            asignarRubros.Parameters.Add("rubroID",SqlDbType.Int,18).Value = rubro.id;
            asignarRubros.ExecuteNonQuery();
            }

            SqlCommand insertarSubasta = new SqlCommand("INSERT INTO [Monkey_Coders].Subastas (sub_publicacion_id, sub_precio_producto_venta) VALUES (@publicacion, @precio)", con);
                insertarSubasta.Parameters.Add("publicacion", SqlDbType.Int, 18).Value = newID;
                insertarSubasta.Parameters.Add("precio", SqlDbType.Float, 18).Value = mTBPrecio.Text;
                insertarSubasta.ExecuteNonQuery();

        
        }


        public bool validarCamposPublicacion(MaskedTextBox mTBStock, TextBox textBoxDesc, ListBox listBoxRubrosFinal)
        {
            bool retorno = true;

            if (mTBStock.Text == "")
            {
                MessageBox.Show("Por favor ingrese un stock", "FRBA-Commerce", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                retorno = false;
            }
            else if (Convert.ToInt32(mTBStock.Text) == 0)
                {
                MessageBox.Show("El stock no puede ser 0", "FRBA-Commerce", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                retorno = false;
                }

            if (textBoxDesc.Text == "")
            {
                MessageBox.Show("Por favor inserte una descripción", "FRBA-Commerce", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                retorno = false;
            }

            if (listBoxRubrosFinal.Items.Count == 0)
            {
                MessageBox.Show("Debe Seleccionar por lo menos un rubro", "FRBA-Commerce", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                retorno = false;
            }

            return retorno;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (radioButtonCI.Checked == true)
                tipo = "Compra Inmediata";
            else
                tipo = "Subasta";

            if (!validarCamposPublicacion(mTBStock,textBoxDesc,listBoxRubrosFinal))
                return;

            SqlConnection con = Program.obtenerConexion();

            publicar();

            MessageBox.Show("Publicación realizada con éxito!");

            this.Close();
        }

        public void actualizarVencimiento()
        {
            DateTime fechaInicio, fechaVencimiento;
            fechaInicio = DateTime.ParseExact(mTBFechaInicio.Text, "dd/MM/yyyy",System.Globalization.CultureInfo.InvariantCulture);
            fechaVencimiento = fechaInicio.AddDays(((Generar_Publicacion.GenerarPublicacion.Visibilidad)comboBoxVisib.SelectedItem).duracion);
            mTBFechaVencimiento.Text = fechaVencimiento.ToString();
        }

        private void comboBoxVisib_SelectedIndexChanged(object sender, EventArgs e)
        {
            actualizarVencimiento();
        }

        private void mTBPrecio_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (((e.KeyChar < 48 || e.KeyChar > 57) && e.KeyChar != 8 && e.KeyChar != 44))
            {
                e.Handled = true;
                return;
            }

            if (e.KeyChar == 44)
            {
                if ((sender as TextBox).Text.IndexOf(e.KeyChar) != -1)
                    e.Handled = true;
            }
        }

        private void mTBPrecio_TextChanged(object sender, EventArgs e)
        {

        }


    }
}
